package com.Object类.重写equals方法;

public class EqualsExercise01 {
    //重写equals方法，判断对象的属性是否完全相同；
    public static void main(String[] args) {
        person p1 = new person("jack", 12, '男');
        person p2 = new person("jack", 12, '男');
        System.out.println(p1.equals(p2));  // true
        /**1.先把p2传进去，判断 if(this == obj) 为假；
         * 2. 判断 if(obj instanceof person)为真；因为obj是p2（person类），所以为真；
         * 3. 继续判断 if(this.name == p.name && this.age == p.age && this.gender == p.gender) 为真；
         * 4. 返回true
         * */
        person p3 = new person("Meesi", 35, '男');
        System.out.println(p1.equals(p3));// false
    }
}

class person {
    private String name;
    private int age;
    private char gender;

    public person(String name, int age, char gender) {  // 构造器
        this.name = name;
        this.age = age;
        this.gender = gender;
    }


    public boolean equals(Object obj) {   // 重写equals方法，Object obj（向上转型）
        if (this == obj) {  //this指本对象
            return true;  // 如果两个对象的地址相同，则认为这两个对象是相等的
        }
        if (obj instanceof person) {  // 判断obj是否是person类型
            person p = (person) obj;  // 向下转型，使其可以访问到person类的私有字段，因为obj原本是Object类，所以需要向下转型
            if (this.name == p.name && this.age == p.age && this.gender == p.gender) {  //私有字段name 能在person 类的内部方法中直接访问
                return true;
            }
        }
        return false;//都不满足返回false
    }

}
/**
 * 私有字段 name 只能在 person 类的内部方法中访问。
 * 在这段代码中，p.name 能够访问私有属性 name 的原因是 p 和 this 是同一个类的实例
 * 。在 Java 中，类的实例可以直接访问同一类中其他实例的私有成员（包括字段和方法），即使这些成员被声明为 private。
 * 这是因为私有修饰符仅限制外部类或子类访问，但在同一个类内部是允许访问的。
 * 因此，在 equals 方法中，this 和 p 都是 person 类的实例，
 * 因此可以直接访问彼此的私有字段。
 */
